home *** CD-ROM | disk | FTP | other *** search
- /*
- FileList 1.4
- "Mouse.c"
- */
-
- #include "Main.h"
- #include "Window.h"
- #include "Mouse.h"
-
- /* Used by ScrollText() */
- static WindowPtr Window; /* Current window */
- static short Page; /* Page size */
- static short Row; /* Character height/width */
- static Boolean Vertical; /* TRUE if vertical scroll */
-
- /* ----- Scroll window data -------------------------------------------- */
-
- void Scroll (
- register WindowPtr w,
- Boolean vertical,
- register short delta)
- {
- register void (*pf)(); /* Pointer to function */
- Rect r;
- RgnHandle updateRgn, clip;
-
- updateRgn = NewRgn();
- if (vertical) {
- ContentRect(w, &r);
- ScrollRect(&r, 0, delta * ((WindowDataPtr)w)->height, updateRgn);
- if (delta == -1 || delta == 1)
- pf = RedrawV1;
- else {
- pf = RedrawV;
- delta = FALSE;
- }
- } else {
- ContentHeaderRect(w, &r);
- ScrollRect(&r, delta * ((WindowDataPtr)w)->width, 0, updateRgn);
- if (delta == -1 || delta == 1) {
- pf = /*RedrawH1*/ RedrawV;
- delta = FALSE;
- } else {
- pf = /*RedrawH*/ RedrawV;
- delta = FALSE;
- }
- }
- clip = w->clipRgn;
- w->clipRgn = updateRgn;
- (*pf)(w, delta);
- w->clipRgn = clip;
- DisposeRgn(updateRgn);
- }
-
- /* ----- Resize window's scroll bar ------------------------------------ */
-
- static void FixScrollBar1 (
- register ControlHandle ch,
- Rect *r)
- {
- HideControl(ch);
- MoveControl(ch, r->left, r->top);
- SizeControl(ch, r->right - r->left, r->bottom - r->top);
- ShowControl(ch);
- ValidRect(&(**ch).contrlRect);
- }
-
- void FixScrollBar (register WindowDataPtr w)
- {
- Rect r;
-
- VScrollRect((WindowPtr)w, &r);
- FixScrollBar1(w->vs, &r);
- HScrollRect((WindowPtr)w, &r);
- FixScrollBar1(w->hs, &r);
- }
-
- /* ----- Adjust scroll bars to size of data ---------------------------- */
-
- static void AdjustScrollBar1 (
- register ControlHandle ch,
- register short maxTop,
- short active)
- {
- if (maxTop <= 0) {
- maxTop = 0;
- HiliteControl(ch, 255);
- } else
- HiliteControl(ch, active);
- SetCtlMax(ch, maxTop);
- }
-
- void AdjustScrollBar (register WindowDataPtr w)
- {
- register short a;
- Rect r;
-
- a = (FrontWindow() == (WindowPtr)w) ? 0 : 255;
- ContentRect((WindowPtr)w, &r);
- AdjustScrollBar1(w->vs,
- (short)(w->count - (r.bottom - r.top)/w->height), a);
- AdjustScrollBar1(w->hs,
- w->columns - (r.right - r.left)/w->width, a);
- }
-
- /* ------ Scroll text within window (called by TrackControl()) --------- */
-
- static pascal void ScrollText (
- register ControlHandle ch,
- register short part)
- {
- register short delta;
- register short ex;
-
- switch(part) {
- case inUpButton:
- delta = -Row;
- break;
- case inDownButton:
- delta = Row;
- break;
- case inPageUp:
- delta = -Page;
- break;
- case inPageDown:
- delta = Page;
- break;
- default:
- return;
- }
- SetCtlValue(ch, (ex = GetCtlValue(ch)) + delta);
- Scroll(Window, Vertical, ex - GetCtlValue(ch));
- }
-
- /* ------ Handle mouse-down event in scroll bar ------------------------ */
-
- void DoScroll (
- register WindowDataPtr w,
- register Point pt,
- register short part,
- register ControlHandle ch)
- {
- register short ex;
- Rect r;
-
- ContentRect((WindowPtr)w, &r);
- Row = 1;
- if (ch == w->vs) {
- Vertical = TRUE;
- Page = (r.bottom - r.top)/w->height - 1;
- } else
- if (ch == w->hs) {
- Vertical = FALSE;
- Page = (r.right - r.left)/w->width - 1;
- } else
- return;
- if (part == inThumb) {
- ex = GetCtlValue(ch);
- part = TrackControl(ch, pt, 0L);
- SetCtlValue(ch, GetCtlValue(ch));
- Scroll((WindowPtr)w, Vertical, ex - GetCtlValue(ch));
- } else {
- Window = (WindowPtr)w;
- part = TrackControl(ch, pt, ScrollText);
- }
- }
-
- /* ----- Scroll with cursor keys --------------------------------------- */
-
- void KeyScroll (
- register WindowDataPtr w,
- Boolean vertical,
- register short part)
- {
- register ControlHandle ch;
- Rect r;
-
- SetPort(Window = (WindowPtr)w);
- ContentRect((WindowPtr)w, &r);
- Row = 1;
- if (vertical) {
- Vertical = TRUE;
- Page = (r.bottom - r.top)/w->height - 1;
- ch = w->vs;
- } else {
- Vertical = FALSE;
- Page = (r.right - r.left)/w->width - 1;
- ch = w->hs;
- }
- ScrollText(ch, part);
- }
-
- /* ----- Mouse click in window content region -------------------------- */
-
- void DoContent (
- register EventRecord *event,
- register WindowPtr w)
- {
- Point local;
- register short part;
- ControlHandle control;
- Rect r;
-
- if (w != FrontWindow())
- SelectWindow(w);
- else {
- SetPort(w);
- local = event->where;
- GlobalToLocal(&local);
- part = FindControl(local, w, &control);
- if (part) /* Control region */
- DoScroll((WindowDataPtr)w, local, part, control);
- else { /* Content region */
- ContentRect(w, &r);
- if (PtInRect(local, &r))
- FindRow((WindowDataPtr)w, local);
- }
- }
- }
-
- /* ----- Mouse Click in grow region ------------------------------------ */
-
- void DoGrow (
- register WindowPtr w,
- register Point GlobalMouse)
- {
- register long newSize;
-
- if (w != FrontWindow()) {
- SelectWindow(w);
- return;
- }
- if (newSize = GrowWindow(w, GlobalMouse, &Bounds))
- SetWindowSize((WindowDataPtr)w, LoWord(newSize), HiWord(newSize));
- }
-
- /* ----- Mouse Click in zoom region ------------------------------------ */
-
- void DoZoom (
- register WindowPtr w,
- register short where)
- {
- if (w != FrontWindow()) {
- SelectWindow(w);
- return;
- }
- SetPort(w);
- EraseRect(&w->portRect);
- ZoomWindow(w, where, TRUE);
- InvalRect(&w->portRect);
- FixScrollBar((WindowDataPtr)w); /* Resize window's scroll bar */
- AdjustScrollBar((WindowDataPtr)w); /* Adjust to size of document */
- }
-